Acertijo en BASIC

Programando el Amstrad en BASIC, C, etc.
abalore
Forero habitual
Forero habitual
Mensajes: 152
Registrado: Dom 09 Jul , 2006 8:59 pm

Acertijo en BASIC

Mensajepor abalore » Sab 27 Jun , 2015 10:25 pm

Hola a todos,

La idea es generar una animación sencilla a 50 Hz sincronizada con el refresco vertical en BASIC.

Para ello he creado este simple programa, que hay que ejecutar en un CPC o plus real para poder observar el efecto:

Código: Seleccionar todo

10 MODE 1
20 DEFINT a-z
30 x=1:xa=1
40 CALL &BD19
50 LOCATE x,13:PRINT " O ";
60 x=x+xa
70 IF x=38 OR x=1 THEN xa=-xa
80 GOTO 40
Los que podáis ejecutar estas 8 líneas en un ordenador real veréis el curioso e inesperado efecto que se produce.

El reto consiste en dar la mejor explicación técnica a lo que sucede.

saludos

Avatar de Usuario
robcfg
Master of The Forum
Master of The Forum
Mensajes: 1305
Registrado: Jue 03 Abr , 2008 5:32 pm
Ubicación: Estocolmo
Contactar:

Re: Acertijo en BASIC

Mensajepor robcfg » Sab 27 Jun , 2015 11:32 pm

Anda! Que curioso!

Van una y vuelven dos...

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: Acertijo en BASIC

Mensajepor ronaldo » Dom 28 Jun , 2015 3:44 am

Lo que sucede es sencillo. BASIC es mucho más lento de lo que parece. De hecho, esta sencilla rutina está borderline para conseguir los 50 Hz (en algunos casos excede los 19968 microsegundos por fotograma), por lo que estaría yendo a unos 42-45 Hz.

Además de ser lento BASIC, leer caracteres del ROM y dibujarlos es algo que es lento de por sí. En este caso, estás dibujando 3 caracteres que se dibujan uno detrás de otro (espacio - O - espacio). Los 2 primeros se dibujan antes de que el haz de electrones pase por la zona de la pantalla donde se está dibujando. Entonces, el haz de electrones recorre las 8 filas de píxeles donde hay 2 O dibujados (porque aún no se ha dibujado el espacio que borraría la siguiente O), dibujando las 2 O's. Entonces, el último espacio se renderiza pero, como el haz de electrones ya ha pasado, se siguen viendo 2 O's por pantalla.

Es fácil comprobar que se trata de esto. Si en lugar de dibujar en la línea 13, dibujamos en la 16 o 17, no veremos 2 O's, sino 1 O y media. En este caso, el haz de electrones pasa por ahí justo cuando estamos a medias de dibujar el tercer espacio, por lo que media O está borrada y la otra media sigue ahí.

Finalmente, si dibujamos en la línea 19, el efecto desaparece, porque da tiempo a dibujar los 3 caracteres antes de que llegue el haz de electrones.

He probado a optimizar un poquito el código, para ver si con eso reducía lo suficiente como para que dibuje en la línea 13 antes de la llegada del haz de electrones. Aún así, lo más que he conseguido es que funcione como debe desde la línea 17 y casi casi la 16:

Código: Seleccionar todo

10 MODE 1
20 DEFINT a-z
30 p=0:x=1:a=1:a$=CHR$(31)+CHR$(1)+CHR$(17)+" O "
40 p=@a$:p=UNT(PEEK(p+1))+UNT(256*PEEK(p+2))+1
50 CALL &BD19:?a$:x=x+a:POKE p,x:IF x=38OR x=1THEN a=-a
60 GOTO 50
Todavía podría mejorarse un poquito, y quizá reducir algunas líneas, si se dibujan sólo 2 caracteres en lugar de 3.

abalore
Forero habitual
Forero habitual
Mensajes: 152
Registrado: Dom 09 Jul , 2006 8:59 pm

Re: Acertijo en BASIC

Mensajepor abalore » Dom 28 Jun , 2015 1:41 pm

Excelente explicación!

Las rutinas para dibujar caracteres del firmware: TXT OUTPUT (&BB5A) y TXT WR CHAR (&BBD5) son terroríficamente lentas. Llamándolas desde ensamblador son capaces de dibujar tan solo 6 caracteres por cada frame. La instrucción PRINT de BASIC llama a TXT OUTPUT, por lo que el cuello de botella está en el firmware, no importa lo mucho que optimicemos el programa en BASIC.

Si activamos el texto en modo gráfico, los resultados son todavía peores, reduciéndose a 3 caracteres por frame los que podemos dibujar.


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic