SCROLL (Vertical - Horizontal)

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

SCROLL (Vertical - Horizontal)

Mensajepor pser1 » 25 Sep 2016 18:22

Un SCROLL vertical para PMODE4

Un posible método para hacer el scroll vertical hacia abajo de toda la pantalla en modo PMODE4 podría ser éste
He puesto una llamada a leer tecla para poder ver el scroll linea por línea. En la prácica no será necesario.

DISCOS	equ	$0600		; poner valor $0000 si no habra discos
org $4000 ; donde ubicar el programa
ldb #192 ; numero de lineas a hacer scroll


; SIGUE EL SCROLL REAL ( 5 líneas de código)
L1 ldx #$1de0+DISCOS ; apunta al primer byte de la última fila de pixels
L2 ldu ,--x ; apunta dos antes y toma dos bytes
stu 32,x ; los pone en la fila de abajo
cmpx #$0600+DISCOS ; apunta fuera de pantalla (por arriba)?
bhi L2 ; no, sigue
; ACABA EL SCROLL REAL

pshs b,x ; guardar registros de trabajo
L3 jsr $8006 ; lee teclado
beq L3 ; no tecla, lee de nuevo
puls b,x ; recuperar contador y puntero
decb ; decrementa contador de lineas
bne L1 ; no finalizado, sigue
rts ; retorna


saludos
pere

Avatar de Usuario
minter
Mensajes: 2024
Registrado: 22 Jul 2014 18:51
Agradecido : 1488 veces
Agradecimiento recibido: 611 veces

Re: SCROLL vertical

Mensajepor minter » 19 Oct 2016 16:49

A mí me mata el tema de no poder hacer scroll con los punteros de vídeo. -banghead

El copiar pegar información siempre se me hizo tedioso para el tema de la pantalla si no puedes ocultarla en otro plano y luego activarla.

No lo he probado, pero sería algo similar a esto?

https://www.youtube.com/watch?v=pH7BM8gU5Qc

Me he descargado el 6809 cookbook para ver la cantidad de ciclo que se consumen, pero me pierdo si no miro un contador y no tengo uno aquí. La rutina irá mas rápido si en vez de esperar tecla mediante bucle, tira de interrupción, no?

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 19 Oct 2016 19:52

Buenas tardes,
en principio el bucle esperando tecla en la versión 1 estaba puesto para poder ver el efecto de mover solamente
una linea (pixel vertical) hacia abajo.
Si quieres contar ciclos, entonces te recomiendo que utilices el compilador LWASM que lo puede hacer.
Adjunto al final el listado de la compilación con LWASM para que veas el conteo de ciclos (no es perfecto)
Quiero decir que en algunos tipos de indexado a veces calcula +-1 ciclo con error!
He hecho algunas pruebas mas y las he puesto como ejecutables en un VDK que puedes probar en XRoar
Encontrarás v1, v2, v3 y la v3u que es un intento de acelerarlo usando stacks!
Te adjunto fuente de éste último ...

Código: Seleccionar todo

         org   $4000               ; donde ubicar el programa
         orcc   #$50
         sts   copStack
         ldb   #192               ; numero de lineas a hacer scroll
         stb   counter
L1         lds   #$23c0            ; apunta al primer byte de la penúltima fila de pixels
         ldu   #$23e6            ; apunta al primer byte de la última fila de pixels
L2         puls   d,x,y               ; toma 6 bytes de origen
         pshu   d,x,y               ; los copia a destino
         leau   12,u               ; salta los 6 guardados y deja hueco para 6 mas
         puls   d,x,y               ; toma 6 bytes de origen
         pshu   d,x,y               ; los copia a destino
         leau   12,u               ; salta los 6 guardados y deja hueco para 6 mas
         puls   d,x,y               ; toma 6 bytes de origen
         pshu   d,x,y               ; los copia a destino
         leau   12,u               ; salta los 6 guardados y deja hueco para 6 mas
         puls   d,x,y               ; toma 6 bytes de origen
         pshu   d,x,y               ; los copia a destino
         leau   12,u               ; salta los 6 guardados y deja hueco para 6 mas
         puls   d,x,y               ; toma 6 bytes de origen
         pshu   d,x,y               ; los copia a destino
         leau   8,u               ; salta los 6 guardados y deja hueco para 2 mas
         puls   d                  ; toma 2 bytes de origen
         pshu   d                  ; los copia a destino
         leas   -64,s               ; retrocede la fila ya copiada y otra mas
         leau   -64+2+6,u         ; lo mismo menos los dos últimos bytes y el hueco de 6 para empezar
         cmps   #$0c00            ; apunta fuera de pantalla (por arriba)?
         bhs   L2                  ; no, sigue
         dec   counter            ; decrementa contador de lineas
         bne   L1                  ; no finalizado, sigue
         lds   copStack            ; restore stack
         andcc   #$af
         rts                     ; retorna
copStack   fdb   $0000   
counter   fcb   $00

Si la velocidad es lo que importa, entonces hay que cambiar el bucle interno de 192 lineas por una macro que genere 192 veces
el mismo código ... nos ahorramos las comparaciones y el salto hacia atrás. La gente que usa macros asegura que de esta forma se puede acelerar mucho ...

saludos
pere
SCROLL.ZIP
(30.35 KiB) Descargado 21 veces

scrol3u.lst.zip
(1 KiB) Descargado 17 veces

jltursan
Mensajes: 2251
Registrado: 20 Sep 2011 13:59
Agradecido : 109 veces
Agradecimiento recibido: 300 veces

Re: SCROLL vertical

Mensajepor jltursan » 19 Oct 2016 20:37

Cuando he visto lo del conteo de ciclos se me han iluminado los ojillos hasta que me he puesto con ello. Como diantre se activa eso en el LWASM?

He probado con todas las combinaciones que se me han ocurrido de PRAGMA y OPT sin exito (OPT c, PRAGMA c, --pragma=c, etc.) -banghead

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 19 Oct 2016 22:17

jeje, yo también lo pregunté!

Pon en la primera linea de programa:
opt cd
Y a vivir!


saludos
pere

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 19 Oct 2016 22:25

retomando el tema del scroll vertical ...
He modificado mas el tema del stack para poder copiar de golpe 8 bytes ...
este es el fuente ... ya con macros para tenerlo totalmente en plan código salchicha

Código: Seleccionar todo

         opt   cd
         org   $4000               ; donde ubicar el programa
start      orcc   #$50               ; deshabilita interrupciones
         sts   <$e6               ; guarda el stack
         ldb   #192               ; numero de lineas a hacer scroll
         stb   <$76               ; lo guarda en variable pagina 0
L1         lds   #$23c0            ; apunta al primer byte de la penúltima fila de pixels - #ori apunta al inicio de datos a mover

c1lin      macro
         puls  d,x,y,u            ; copia 8 bytes del origen
         leas  32,s               ; apunta a octavo byte del inicio siguiente linea
         pshs  d,x,y,u            ; guarda los 8 bytes en destino
         leas  -24,s               ; apunta a siguiente linea origen para seguir copiando
         puls  d,x,y,u            ; copia 8 bytes del origen
         leas  32,s               ; suma offset para obtener dirección de destino
         pshs  d,x,y,u            ; guarda los 8 bytes en destino
         leas  -24,s               ; resta el offset y le suma 8 para seguir copiando
         puls  d,x,y,u            ; copia 8 bytes del origen
         leas  32,s               ; suma offset para obtener dirección de destino
         pshs  d,x,y,u            ; guarda los 8 bytes en destino
         leas  -24,s               ; resta el offset y le suma 8 para seguir copiando
         puls  d,x,y,u            ; copia 8 bytes del origen
         leas  32,s               ; suma offset para obtener dirección de destino
         pshs  d,x,y,u            ; guarda los 8 bytes en destino
         leas  -88,s               ; apunta 3 filas atrás (la destino, origen y otra)
         endm
         
c10lin   macro
         c1lin
         c1lin
         c1lin
         c1lin
         c1lin
         c1lin
         c1lin
         c1lin
         c1lin
         c1lin
         endm

         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c10lin
         c1lin

         dec   <$76               ; decrementa contador de lineas
         lbne   L1                  ; no finalizado, sigue
         lds   <$e6               ; restore stack
         andcc   #$af               ; habilita interrupciones
         rts                     ; retorna
         end    start

Pelin peñazo pues hace 191 líneas ya que la última no hace falta moverla!
Adjunto VDK con mas versiones. Otro tema a estudiar es la sincronización en pantalla ya que estas
versiones presentan glitches.
Cambiando la linea 110 del programa basic "TST.BAS" se pueden probar las diferentes variantes.
Trataré de buscar información respecto a lo del scroll por hardware ... me suena que Simon Jonassen
me había contado algo, pero lo he olvidado :-(

saludos
pere
SCROLL5.ZIP
(30.29 KiB) Descargado 16 veces

dancresp
Mensajes: 5277
Registrado: 13 Nov 2010 02:08
Agradecido : 100 veces
Agradecimiento recibido: 203 veces

Re: SCROLL vertical

Mensajepor dancresp » 19 Oct 2016 22:35

Por lo visto en el vídeo, un pelín lento el scroll, ¿no?

Avatar de Usuario
minter
Mensajes: 2024
Registrado: 22 Jul 2014 18:51
Agradecido : 1488 veces
Agradecimiento recibido: 611 veces

Re: SCROLL vertical

Mensajepor minter » 20 Oct 2016 00:03

dancresp escribió:Por lo visto en el vídeo, un pelín lento el scroll, ¿no?


No, el video no tiene nada que ver con el scroll de pser.
Lo puse por el tema del concepto. Es sobre un COCO II. No es mío.

Lo del los glitches lo estaba pensando yo también mientras cenaba. Desconozco los tiempos del los retrazos en Dragón.
No conozco el registro que indica el retrazo vertical y horizontal. Tengo que mirarlo.
¿Da tiempo a escribir una linea durante un retrazo horizontal? o Hay que esperar el vertical?

Para tema de sprites, al ser una menor cantidad de información, se puede corregir, pero al ser una pantalla completa...
Pruebo el código nuevo para ver en persona como va y cuento. (Voy emulado, no tengo máquina real.)

Gracias!

jltursan
Mensajes: 2251
Registrado: 20 Sep 2011 13:59
Agradecido : 109 veces
Agradecimiento recibido: 300 veces

Re: SCROLL vertical

Mensajepor jltursan » 20 Oct 2016 07:14

El "opt cd" tampoco me va, de hecho ya lo habia probado...deduzco que tengo que revisar la version de mi lwasm, va a ser que no es la que soporta esto -shock

El scroll vertical me temo que va a ser imposible sincronizarlo (en principio supongo que con un SYNC), por fuerza debe de durar mas que el retrazado vertical, si que se podria hacer algo con tecnicas de doble buffer. No tengo claras las capacidades del VDG/SAM al respecto.

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 20 Oct 2016 11:22

@jltursan
Yo me descargé la versión "Lwtools v4-13 Windows 32" y lo tengo en un Windows64.
Con este simple bat me funciona bien:

Código: Seleccionar todo

lwasm -b -o %1.bin %1.asm -l > %1.lst.txt

Y lo único añadido en el fuente, que no pongo cuando trabajo con ASM6809, es
opt cd

Suerte!
pere

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 20 Oct 2016 11:33

minter escribió:Lo de los glitches lo estaba pensando yo también mientras cenaba. Desconozco los tiempos del los retrazos en Dragón.
No conozco el registro que indica el retrazo vertical y horizontal. Tengo que mirarlo.
¿Da tiempo a escribir una linea durante un retrazo horizontal? o Hay que esperar el vertical?
Gracias!

El MC6847 (VDG en Dragón y CoCo2) genera interrupciones hardware que se detectan mirando las PIAs.
Veo muy difícil mover toda la pantalla en el tiempo que va desde el final de la última línea (crea interrupción)
hasta el inicio de la primera (también crea interrupción), por lo que lo más seguro sería trabajar tipo doble buffer
pintando en dos areas de pantalla diferentes y conmutando la SAM para que muestre la que queremos tras un
opcode SYNC para evitar el glitch.
En $FF03, el bit 7 indica llegada de sincronismo Vertical
En $FF01, el bit 7 indica llegada de sincronismo Horizontal

saludos
pere

Avatar de Usuario
minter
Mensajes: 2024
Registrado: 22 Jul 2014 18:51
Agradecido : 1488 veces
Agradecimiento recibido: 611 veces

Re: SCROLL vertical

Mensajepor minter » 20 Oct 2016 15:01

Las pruebas no están nada mal, son suaves. No molesta tanto ese glitch.

ScrollscreenPmode4.JPG
ScrollscreenPmode4.JPG (60.57 KiB) Visto 624 veces


Lo de evitar las lineas quebradizas, sería como dices, hacer el cambio de la memoria de vídeo y conmutando.

¿Se SAM puede conmutar a cualquier parte de la RAM el inicio del vídeo?

Otro tema sería que la pantalla hiciera un roll, apareciendo lo que desaparece por abajo, por la parte de arriba, tal como ponías en interrogantes.

Antes de borrar la linea con la información de la anterior, ¿podríamos meter la linea a borrar entera en la pila y después de ejecutar la macro volver a pegarla en la primera posición de la pantalla?

Hmmm... lo pienso y no lo veo....

Voy a dormir un siesto a ver si recuerdo como hacer una rotación de pantalla.

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 20 Oct 2016 15:12

@minter
esto es una idea que ha acabado con varios métodos para hacer scroll vertical de un pixel
a lo largo de TODA la pantalla.
En una aplicación práctica (un juego), seguramente habrá una parte con contadores de
puntuación, número de vidas y otras hierbas, zona que NO querremos que se mueva, así
que presumiblemente el área a mover será menor y por tanto más rápido hacerlo.

Si justo antes de mover la penúltima línea sobre la última nos guardamos ésta en un
buffer de 32 bytes (podrían ser los 32 siguientes al fin de pantalla!), bastará que cuando
hayamos movido la primera línea a la segunda, copiemos desde el buffer a la primera fila.
Intentaré hacerme un ejemplo de scroll circular

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 20 Oct 2016 15:33

Hola,
adjunto un VDK y el fuente del scroll circular en fichero zip
Si lo montáis en XRoar, basta con hacer
RUN"TEST"

saludos
pere
SCROLL6.ZIP
(31.22 KiB) Descargado 21 veces

Avatar de Usuario
pser1
Mensajes: 2233
Registrado: 08 Dic 2012 18:34
Agradecido : 308 veces
Agradecimiento recibido: 337 veces

Re: SCROLL vertical

Mensajepor pser1 » 20 Oct 2016 16:04

Hola,
una reflexión ....
Si tenemos un ordenador PAL, que genera 50 imágenes por segundo
nos deja exactamente 0,02 segundos = 20 milisegundos para hacer
operaciones entre DOS imágenes ...
Como Dragón funciona (en RAM) a 0,89Mhz, esto nos da
890.000 ciclos/seg * 0,02 seg = 17.800 ciclos de reloj
Si tomamos la parte del bucle de la versión SCROLL5 para ver el conteo de ciclos

Código: Seleccionar todo

400D 3576             (       scrol5.txt):00008 (4+8)   bucle           puls  d,x,y,u       
400F 32E820           (       scrol5.txt):00009 (4+1)                           leas  32,s   
4012 3476             (       scrol5.txt):00010 (4+8)                           pshs  d,x,y,u
4014 32E8E8           (       scrol5.txt):00011 (4+1)                           leas  -24,s 
4017 3576             (       scrol5.txt):00012 (4+8)                           puls  d,x,y,u
4019 32E820           (       scrol5.txt):00013 (4+1)                           leas  32,s   
401C 3476             (       scrol5.txt):00014 (4+8)                           pshs  d,x,y,u
401E 32E8E8           (       scrol5.txt):00015 (4+1)                           leas  -24,s 
4021 3576             (       scrol5.txt):00016 (4+8)                           puls  d,x,y,u
4023 32E820           (       scrol5.txt):00017 (4+1)                           leas  32,s   
4026 3476             (       scrol5.txt):00018 (4+8)                           pshs  d,x,y,u
4028 32E8E8           (       scrol5.txt):00019 (4+1)                           leas  -24,s 
402B 3576             (       scrol5.txt):00020 (4+8)                           puls  d,x,y,u
402D 32E820           (       scrol5.txt):00021 (4+1)                           leas  32,s   
4030 3476             (       scrol5.txt):00022 (4+8)                           pshs  d,x,y,u
4032 32E8A8           (       scrol5.txt):00023 (4+1)                           leas  -88,s 
4035 118C0C00         (       scrol5.txt):00024 (4)                             cmps  #$0c00
4039 24D2             (       scrol5.txt):00025 (3)                             bhs   bucle 

El bucle que se repite 192 veces requiere: 8 * (4+8 + 4+1) + 4 + 3 = 192 * 143 = 27.546 ciclos
que EXCEDE en mucho los 17.800 ciclos máximos que podemos usar entre dos imágenes.
Claramente 2 imágenes permitirían 2 * 17.800 = 35.600 lo que nos da para ésto ya mucho mas!
Pero para ello NO podemos estar marraneando directamente en pantalla, sino que debemos
trabajar en otra área (técnica de doble buffer) y conmutar de la anterior a la nueva cuando
llegue la siguiente interrupción una vez hecho el scroll.
Lo que nos sucede ahora es que cuando llevamos hecho 17800/27546 o sea aproximadamente
un 65% de las líneas, la pantalla es actualizada creando el maldito glitch en la línea sobre la
que estamos trabajando en aquel momento :-(
Analizar como implementar el doble buffer se cargará sin dudas el método del stack ya que las
áreas origen y destino estará separadas, por lo menos, unos 6144 bytes y estos offsets pueden
penalizar mucho (habría que verificar). Aparte el frame rate sería de 25, todavía soportable.
El otro tema a tener en cuenta es que primero copiamos (desplazando) de A hacia B (aumentando
la posición de memoria), pero la siguiente vez copiaremos de B hacia A (reduciendo la posición
de memoria)

Se aceptan propuestas ...
saludos
pere

Avatar de Usuario
Chema
Mensajes: 1998
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 1210 veces
Agradecimiento recibido: 399 veces
Contactar:

Re: SCROLL vertical

Mensajepor Chema » 20 Oct 2016 16:38

Hola pser! Bienvenido a mi mundo... ordenadores sin ayuda hard para hacer scrolls :)

Lo que dices es así. En un Oric no hay tiempo en los 20.000 ciclos que hay entre cuadros (vamos a 1MHz) ni para borrar la pantalla (escribir ceros). Si vas a usar un doble buffer, aparte de la cantidad de memoria extra que necesitas, hay que copiar el buffer sobre la pantalla. Igual podéis volcar en esos 17.800 ciclos, pero si no da tiempo, volverá a haber glitches (tearing) porque pillará parte actualizada y parte sin actualizar.

Eso sí, es cosa de hacer el scroll sobre la imagen en doble buffer e ir volcando el mismo sobre la memoria de pantalla en cada barrido vertical. O sea el scroll igual que ahora, pero sobre el buffer oculto, más una rutina de volcado que *vuele*.

Ojo que creo que no es tan fácil como se pinta. En realidad para que se vea perfecto debería volcarse en el tiempo que el haz no está barriendo la pantalla, o sea cuando acaba por abajo y antes de que empiece por arriba. O asegurar mucho los timings para ir volcando "persiguiendo el haz" (por detrás de lo que está actualizando).

O eso creo recordar de cuando miré estas cosas para Oricium. Lo que pasa es que allí era otro problema y me bastaba con actualizar pocas cosas en el tiempo entre frames (el resto de cálculos sí que llevaban tiempo y no pude ir más allá de 25 frames por segundo).


Volver a “Software Dragon”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados