--- En hispamsx(_en_)yahoogroups(_punto_)com, "viejo_archivero"
<jon_cortazar@t...> escribió:
Bufff, menudo lio que me estoy haciendo :-), vamos a ver, por
partes:
Thanx por lo del POKE, es a lo que me refería: efectivamente no es
lo
que necesito, ya que quiero scrolear texto en la zona inferior de
pantalla. Con lo cual, lo que necesito en este caso es un programa
ensamblador que lo haga. Según lo que he entendido...
1. Mi programa en BASIC detecta que he llegado al límite y es hora
de
hacer el scroll. Entonces lanzo el USR maldito.
2. Salta el ensamblador, que copia la zona de mapa de caracteres de
VRAM a RAM de la zona que interesa y acto seguido vuelve a copiar a
VRAM el texto subiendo una fila.
3. El BASIC vuelva a tener el control.
Voy a estudiar un poquillo esa rutina que me habéis estado
escribiendo -muchas gracias, por cierto (^_^)- porque,
sinceramente,
el ensamblador para mi es como el egipcio antiguo, más o menos :-).
Lo ideal sería hacer una rutina 100% reubicable, ya que todo el
buffer de datos de la aventura (objetos, localizaciones y demás) va
también en un BIN... buff, le daré una vuelta, a ver que saco en
claro.
Hola, Jon, voy a ver si me explico mejor, la verdad es que leyendo
ahora mi mensaje no me entero de nada :)
A ver, hay una rutina de la BIOS que copia una zona de la VRAM a RAM.
En mi caso, la copio a la dirección 53000 (ojito, hay que hacer clear
200,52999 al principio de tu programa). Debes reservar esa zona de
memoria para que no te la pise el basic y se líe la de Dios es
Cristo. No sé cuánta memoria te hace falta a tí, así que puedes
cambiar ese valor (recuerda que cuanto más alto sea, menos memoria te
queda para el basic).
Por cierto, la rutina es totalmente reubicable porque no utiliza
salto alguno, son sólo llamadas a la bios.
Examinemos la primera parte del código:
9100 DATA 21,c0,19:'ld hl,6592
9110 DATA 11,08,cf:'ld de,53000
9120 DATA 06,00:' ld b,01
9130 DATA 0e,ff:' ld c,20
9140 DATA cd,59,00:'call 89
La rutina bios es la 89, que verás en el último call. En el registro
hl se mete el comienzo de la dirección de la pantalla que quieres
copiar. En este caso, es la 6592. ¿Cómo calcularlo a tus necesidades?
Pues con esta fórmula: valor=6144+línea*32+columna. vamos, que
quieres una ventana que empiece en la línea 10 , pues tienes que
copiar desde la línea 11 (recuerda que copiamos desde una línea
inferior, para subirla luego 1 fila). Esto nos da que el valor es
6144+11*32+0.
En el registro de, que verás en la segunda línea, debes introducir la
dirección de la ram a partir de la que quieras copiar. En este caso
dijimos la 53000.
Todo esto claro está en hexadecimal. En hl y de metes primero la
parte menos significativa, pero en ld b,.. y ld c,... metes primero
la más significativa.
Ahora en el registro bc metemos el tamaño del bloque a mover.
Queremos que nuestra ventana tenga 10 líneas de ancho. ¿Cuál es la
longitud? Pues 10 líneas x 32 caracteres por línea nos dan 320, que
es lo que ponemos allí.
Se ejecuta luego el call y listo. Ya está copiado ese trozo de
pantalla en la RAM :)
Como bien decía flyguille, los valores de los rems y los data no
concuerdan porque al principio introduje unos valores y luego los
modifiqué y no actualicé los rems correspondientes, pero vamos, que
el rollo este funciona :)
La segunda parte de la rutina sería:
9150 DATA 21,08,cf:'ld hl,53000
9160 DATA 11,a0,19:'ld de,6560
9170 DATA 06,01:' ld b,01
9180 DATA 0e,40:' ld c,20
9190 DATA cd,5c,00:'call 92
9200 DATA c9:' ret
Volcamos lo que tenemos en 53000 a la pantalla pero una línea más
arriba. Si tomamos que la ventana empezaba en la 10, pues copio los
320 caracteres a esa línea. O sea, en hl metemos la dirección de la
RAM desde la que copiamos, en "de" la dirección de la pantalla (en
este caso 6144+10*32+0) y en bc de nuevo la longitud (nuevamente
320). El call 92 se encarga de mover el bloque y el ret final te
devuelve el control al BASIC.
Todo este follón hay que liarlo porque al menos hasta donde sé, no
hay ninguna rutina BIOS que te copie a la pantalla directamente, hay
que copiar primero a RAM y de allí de nuevo a la pantalla.
Estoy releyendo el mensaje y me parece que me he vuelto a explicar
como el culo :(. De todas formas, dime dónde quieres hacer el scroll
y su longitud y te paso un archivo .bas con la rutina :)
Ups, se supone que estoy en el curro currando :) Luego miro el correo
y ya contesto con más calma, jejeje :)
Un saludo.
Juanma