HispaMSX

RE: Una ayudita (MSX 1, BASIC)

2004-07-01 19:29:53
--- 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




<Anterior en la conversación] Conversación actual [Siguiente en la conversación>